Completed
Push — master ( cd2326...65f97e )
by Maxence
03:06
created

nav.displayCirclesList   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.3142
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
/*
2
 * Circles - Bring cloud-users closer together.
3
 *
4
 * This file is licensed under the Affero General Public License version 3 or
5
 * later. See the COPYING file.
6
 *
7
 * @author Maxence Lange <[email protected]>
8
 * @copyright 2017
9
 * @license GNU AGPL version 3 or any later version
10
 *
11
 * This program is free software: you can redistribute it and/or modify
12
 * it under the terms of the GNU Affero General Public License as
13
 * published by the Free Software Foundation, either version 3 of the
14
 * License, or (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU Affero General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU Affero General Public License
22
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
 *
24
 */
25
26
/** global: OC */
27
/** global: OCA */
28
/** global: Notyf */
29
30
/** global: actions */
31
/** global: nav */
32
/** global: elements */
33
/** global: resultCircles */
34
/** global: resultMembers */
35
/** global: resultLinks */
36
/** global: curr */
37
/** global: api */
38
/** global: define */
39
40
var nav = {
41
42
	initNavigation: function () {
43
		this.initElementsAddMemberNavigation();
44
		this.initElementsLinkCircleNavigation();
45
		this.initElementsCircleNavigation();
46
47
		this.displayCirclesList('all');
48
49
		var circleId = window.location.hash.substr(1);
50
		if (circleId) {
51
			actions.selectCircle(circleId);
52
		}
53
	},
54
55
56
	initElementsAddMemberNavigation: function () {
57
58
		elements.addMember.hide();
59
		elements.addMember.on('input propertychange paste focus', function () {
60
			var search = $(this).val().trim();
61
			if (search === '') {
62
				elements.membersSearchResult.fadeOut(400);
63
				return;
64
			}
65
66
			actions.searchMembersRequest(search);
67
			if (elements.membersSearchResult.children().length === 0) {
68
				elements.membersSearchResult.fadeOut(400);
69
			} else {
70
				elements.membersSearchResult.fadeIn(400);
71
			}
72
		}).blur(function () {
73
			elements.membersSearchResult.fadeOut(400);
74
			nav.circlesActionReturn();
75
		});
76
		elements.addMember.on('keydown', function (e) {
77
			if (e.keyCode === 27) {
78
				nav.circlesActionReturn();
79
			}
80
			if (e.keyCode === 13) {
81
				api.addMember(curr.circle, $(this).val(), resultMembers.addMemberResult);
82
			}
83
84
		});
85
86
	},
87
88
89
	initElementsLinkCircleNavigation: function () {
90
91
		elements.linkCircle.hide();
92
		elements.linkCircle.on('keydown', function (e) {
93
94
			if (e.keyCode === 27) {
95
				nav.circlesActionReturn();
96
			}
97
			if (e.keyCode !== 13) {
98
				return;
99
			}
100
101
			api.linkCircle(curr.circle, elements.linkCircle.val(), resultLinks.linkCircleResult);
102
		}).blur(function () {
103
			nav.circlesActionReturn();
104
		});
105
	},
106
107
108
	initElementsCircleNavigation: function () {
109
110
		elements.joinCircle.hide();
111
		elements.joinCircle.on('click', function () {
112
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
113
			nav.circlesActionReturn();
114
		});
115
116
		elements.leaveCircle.hide();
117
		elements.leaveCircle.on('click', function () {
118
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
119
			nav.circlesActionReturn();
120
		});
121
122
		elements.destroyCircle.on('click', function () {
123
			OC.dialogs.confirm(
124
				t('circles', 'Are you sure you want to delete this circle?'),
125
				t('circles', 'Please confirm'),
126
				function (e) {
127
					if (e === true) {
128
						api.destroyCircle(curr.circle, resultCircles.destroyCircleResult);
129
					}
130
				});
131
		});
132
133
		elements.joinCircleAccept.on('click', function () {
134
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
135
		});
136
137
		elements.joinCircleReject.on('click', function () {
138
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
139
		});
140
	},
141
142
143
	displayCirclesList: function (type) {
144
145
		curr.circlesType = type;
146
		curr.searchCircle = '';
147
		curr.searchUser = '';
148
149
		curr.circle = 0;
150
		curr.circleLevel = 0;
151
152
		elements.navigation.show('slide', 800);
153
		elements.emptyContent.show(800);
154
		elements.mainUI.fadeOut(800);
155
156
		elements.circlesSearch.val('');
157
		elements.addMember.val('');
158
		elements.linkCircle.val('');
159
160
		this.resetCirclesTypeSelection(type);
161
		elements.resetCirclesList();
162
		api.listCircles(type, '', 0, resultCircles.listCirclesResult);
163
	},
164
165
166
	resetCirclesTypeSelection: function (type) {
167
		elements.circlesList.children('div').removeClass('selected');
168
		elements.circlesList.children().each(function () {
169
			if ($(this).attr('circle-type') === type.toLowerCase()) {
170
				$(this).addClass('selected');
171
			}
172
		});
173
	},
174
175
	circlesActionReturn: function () {
176
		nav.displayCircleButtons(true);
177
		nav.displaySettings(false);
178
		nav.displayAddMemberInput(false);
179
		nav.displayLinkCircleInput(false);
180
		nav.displayJoinCircleButton(false);
181
		nav.displayInviteCircleButtons(false);
182
	},
183
184
	joinCircleAction: function () {
185
		nav.displayCircleButtons(false);
186
		nav.displayAddMemberInput(false);
187
		nav.displayLinkCircleInput(false);
188
		nav.displayJoinCircleButton(true);
189
	},
190
191
	displayCircleButtons: function (display) {
192
		if (display) {
193
			elements.buttonCircleActionReturn.hide(define.animationMenuSpeed);
194
			elements.buttonCircleActions.delay(define.animationMenuSpeed).show(
195
				define.animationMenuSpeed);
196
		} else {
197
			elements.buttonCircleActions.hide(define.animationMenuSpeed);
198
			elements.buttonCircleActionReturn.delay(define.animationMenuSpeed).show(
199
				define.animationMenuSpeed);
200
		}
201
	},
202
203
	displayAddMemberInput: function (display) {
204
		if (display) {
205
			elements.addMember.val('');
206
			elements.addMember.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
207
				function () {
208
					$(this).focus();
209
				});
210
		} else {
211
			elements.addMember.hide(define.animationMenuSpeed);
212
		}
213
	},
214
215
	displayLinkCircleInput: function (display) {
216
		if (display) {
217
			elements.linkCircle.val('');
218
			elements.linkCircle.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
219
				function () {
220
					$(this).focus();
221
				});
222
		} else {
223
			elements.linkCircle.hide(define.animationMenuSpeed);
224
		}
225
	},
226
227
	displaySettings: function (display) {
228
		console.log('display settings');
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
229
		if (display) {
230
			elements.mainUIMembers.hide(define.animationSpeed);
231
			elements.settingsPanel.delay(define.animationSpeed).show(define.animationSpeed);
232
		} else {
233
			elements.settingsPanel.hide(define.animationSpeed);
234
			elements.mainUIMembers.delay(define.animationSpeed).show(define.animationSpeed);
235
		}
236
	},
237
238
239
	displayInviteCircleButtons: function (display) {
240
		if (display) {
241
			elements.joinCircleAccept.show(define.animationMenuSpeed);
242
			elements.joinCircleReject.delay(define.animationMenuSpeed).show(
243
				define.animationMenuSpeed);
244
		} else {
245
			elements.joinCircleAccept.hide(define.animationMenuSpeed);
246
			elements.joinCircleReject.hide(define.animationMenuSpeed);
247
		}
248
	},
249
250
	displayJoinCircleButton: function (display) {
251
		if (display) {
252
			if (curr.circleStatus === 'Invited') {
253
				elements.joinCircle.hide(define.animationMenuSpeed);
254
				elements.leaveCircle.hide(define.animationMenuSpeed);
255
				nav.displayInviteCircleButtons(true);
256
257
			} else {
258
				nav.displayInviteCircleButtons(false);
259
260
				if (curr.circleLevel === 0 && curr.circleStatus !== 'Requesting') {
261
					elements.joinCircle.delay(define.animationMenuSpeed).show(
262
						define.animationMenuSpeed);
263
					elements.leaveCircle.hide(define.animationMenuSpeed);
264
					elements.joinCircleAccept.hide(define.animationMenuSpeed);
265
					elements.joinCircleReject.hide(define.animationMenuSpeed);
266
267
				}
268
				else {
269
					elements.leaveCircle.delay(define.animationMenuSpeed).show(
270
						define.animationMenuSpeed);
271
					elements.joinCircle.hide(define.animationMenuSpeed);
272
				}
273
			}
274
		} else {
275
			elements.joinCircle.hide(define.animationMenuSpeed);
276
			elements.leaveCircle.hide(define.animationMenuSpeed);
277
		}
278
	},
279
280
281
	/**
282
	 *
283
	 * @param display
284
	 */
285
	displayOptionsNewCircle: function (display) {
286
		if (display) {
287
			elements.newType.fadeIn(300);
288
			elements.newSubmit.fadeIn(500);
289
			elements.newTypeDefinition.fadeIn(700);
290
		}
291
		else {
292
			elements.newType.fadeOut(700);
293
			elements.newSubmit.fadeOut(500);
294
			elements.newTypeDefinition.fadeOut(300);
295
		}
296
	},
297
298
299
	displayMembers: function (members) {
300
301
		elements.remMember.fadeOut(300);
302
		elements.rightPanel.fadeOut(300);
303
304
		elements.mainUIMembersTable.emptyTable();
305
		if (members === null) {
306
			elements.mainUIMembersTable.hide(200);
307
			return;
308
		}
309
310
		elements.mainUIMembersTable.show(200);
311
		for (var i = 0; i < members.length; i++) {
312
			var tmpl = elements.generateTmplMember(members[i]);
313
			elements.mainUIMembersTable.append(tmpl);
314
		}
315
316
		for (i = 0; i < 10; i++) {
317
			if (curr.circleLevel < 9 && curr.circleLevel <= i) {
318
				$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
319
			}
320
		}
321
322
323
		elements.mainUIMembersTable.children('tr.entry').each(function () {
324
325
				var userId = $(this).attr('member-id');
326
327
				//
328
				// level
329
				var level = $(this).attr('member-level');
330
				var levelSelect = $(this).find('.level-select');
331
				if (level === '0') {
332
					levelSelect.hide();
333
				}
334
				else {
335
					levelSelect.show(200).val(level);
336
				}
337
				levelSelect.on('change', function () {
338
					actions.changeMemberLevel(userId, $(this).val());
339
				});
340
341
				//
342
				// status
343
				var status = $(this).attr('member-status');
344
				var statusSelect = $(this).find('.status-select');
345
346
				statusSelect.on('change', function () {
347
					actions.changeMemberStatus(userId, $(this).val());
348
				});
349
				statusSelect.append($('<option>', {
350
					value: status,
351
					text: t('circles', status)
352
				})).val(status);
353
354
				if (curr.circleLevel <= $(this).attr('member-level')) {
355
					return;
356
				}
357
358
				if (status === 'Member' || status === 'Invited') {
359
					statusSelect.append($('<option>', {
360
						value: 'remove_member',
361
						text: t('circles', 'Kick this member')
362
					}));
363
				}
364
365
				if (status === 'Requesting') {
366
					statusSelect.append($('<option>', {
367
						value: 'accept_request',
368
						text: t('circles', 'Accept the request')
369
					}));
370
					statusSelect.append($('<option>', {
371
						value: 'dismiss_request',
372
						text: t('circles', 'Dismiss the request')
373
					}));
374
				}
375
376
			}
377
		)
0 ignored issues
show
Coding Style introduced by
There should be a semicolon.

Requirement of semicolons purely is a coding style issue since JavaScript has specific rules about semicolons which are followed by all browsers.

Further Readings:

Loading history...
378
	},
379
380
381
	displayCircleDetails: function (details) {
382
		elements.circlesDetails.children('#name').text(details.name);
383
		elements.circlesDetails.children('#type').text(t('circles', details.typeLongString));
384
385
		elements.buttonCircleActions.show(300);
386
		elements.addMember.hide(300);
387
	},
388
389
390
	displayMembersInteraction: function (details) {
391
		if (details.user.level < define.levelModerator) {
392
			elements.buttonAddMember.hide();
393
		} else {
394
			elements.buttonAddMember.show();
395
		}
396
397
		if (curr.allowed_federated === '0' || details.type === 'Personal' ||
398
			details.user.level < define.levelAdmin) {
399
			elements.buttonLinkCircle.hide();
400
		} else {
401
			elements.buttonLinkCircle.show();
402
		}
403
404
		elements.joinCircleInteraction.hide();
405
		this.displayNonMemberInteraction(details);
406
407
		if (details.user.level === define.levelOwner) {
408
			elements.destroyCircle.show();
409
			elements.buttonCircleSettings.show();
410
			elements.buttonJoinCircle.hide();
411
		}
412
413
	},
414
415
416
	displayNonMemberInteraction: function (details) {
417
		elements.joinCircleAccept.hide();
418
		elements.joinCircleReject.hide();
419
		elements.joinCircleRequest.hide();
420
		elements.joinCircleInvite.hide();
421
		elements.buttonCircleSettings.hide();
422
		elements.destroyCircle.hide();
423
424
		if (details.user.status === 'Requesting') {
425
			elements.joinCircleRequest.show();
426
			return;
427
		}
428
429
		if (details.user.level > 0) {
430
			return;
431
		}
432
433
		setTimeout(function () {
434
			nav.joinCircleAction();
435
		}, 200);
436
	}
437
438
};
439
440